package main

import "fmt"

// defer的作用，延迟操作
func main() {
	//在main函数结束前调用
	defer fmt.Println("22")
	fmt.Println("11")
	test01()
	test02()
}

func test01() {
	//多个defer 先进后出 发生错误时依旧会执行 但在错误前没有注册的不能执行
	//如果抛错方法有defer 上一个defer 先执行 ，defer执行完，抛错，结束main
	defer fmt.Println("111")
	defer fmt.Println("222")
	//defer fmt.Println("333")
	//panic("this is a error")
}

//闭包中的defer
func test02() {
	var a int
	//如果闭包函数有参数是外部变量，defer里还是变量改变以前的值
	defer func(x int) {
		fmt.Println("inner a=", x)
	}(a)
	a = 100
	fmt.Println("outer a=", a)
}
